using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using CapaAccesoDatos;
using CapaAccesoDatos.Clases;

namespace CapaNegocios
{
    /// <summary>
    /// Clase que se utilizara para el manejo de infracciones.
    /// </summary>
    public class Infraccion
    {
        //---------- <Propiedades> ----------//
        /// <summary>
        /// Campo que contiene el id de la infraccion.
        /// </summary>
        private int id;
        /// <summary>
        /// Campo que contiene la descripcion de la infraccion.
        /// </summary>
        private string descripcion;
        /// <summary>
        /// Campo que contiene la cantidad maxima permitida para una determinada sancion.
        /// </summary>
        private int cantidadMaximaPermitida;        //nivel de gravedad, + o - [1,5] 
        /// <summary>
        /// Campo que contiene la sancion relacionada con cada infraccion.
        /// </summary>
        private Sancion sancionRelacionada;

        //---------- <Accesores> ----------//
        /// <summary>
        /// Obtiene el id de la infraccion.
        /// </summary>
        /// <value>The ID.</value>
        public int ID
        {
            get { return this.id; }
        }
        /// <summary>
        /// Obtiene la descripcion de la infraccion.
        /// </summary>
        /// <value>The descripcion.</value>
        public string Descripcion
        {
            get { return this.descripcion; }
        }
        /// <summary>
        /// Obtiene la cantidad maxima de veces que puede cometerse una infraccion.
        /// </summary>
        /// <value>The cantidad maxima permitida.</value>
        public int CantidadMaximaPermitida
        {
            get { return this.cantidadMaximaPermitida; }
        }
        /// <summary>
        /// Obtiene la sancion relacionada con cada infraccion.
        /// </summary>
        /// <value>The sancion relacionada.</value>
        public Sancion SancionRelacionada
        {
            get
            {
                if (this.sancionRelacionada == null)
                {
                    this.sancionRelacionada = new Sancion(TipoSancionCAD.BuscarPorId(TipoInfraccionCAD.BuscarInfraccionPorId(this.id).TipoSancionID));
                }
                return this.sancionRelacionada;
            }
        }

        //---------- <Constructores y demas metodos> ----------//
        /// <summary>
        /// Constructor que inicializa un objeto Infraccion con la informacion contenida en la base de datos de una
        /// determinada infraccion.
        /// </summary>
        /// <param name="id">The id.</param>
        internal Infraccion(int id)
        {
            TipoInfraccionCAD InfraccionRaw = TipoInfraccionCAD.BuscarInfraccionPorId(id);

            this.id = InfraccionRaw.Id;
            this.descripcion = InfraccionRaw.Descripcion;
            this.cantidadMaximaPermitida = InfraccionRaw.CantidadMaxima;
        }

        /// <summary>
        /// Constructor que inicializa un objeto Infraccion con la informacion contenida en la base de datos de una
        /// determinada infraccion.
        /// </summary>
        /// <param name="Descripcion">La descripcion de la infraccion a instanciar.</param>
        public Infraccion(string Descripcion)
        {
            //se necesita esta constructor para la gende de ASP
            TipoInfraccionCAD InfraccionRaw = TipoInfraccionCAD.BuscarInfraccionPorDescripcion(Descripcion);

            this.id = InfraccionRaw.Id;
            this.descripcion = InfraccionRaw.Descripcion;
            this.cantidadMaximaPermitida = InfraccionRaw.CantidadMaxima;
        }

        /// <summary>
        /// Constructor que se encarga de inicializar un objeto Infraccion con la informacion contenida en la base 
        /// de datos a demas de poner la sancion relacionada con esta infraccion.
        /// </summary>
        /// <param name="Descripcion">The descripcion.</param>
        /// <param name="CantidadMaximaPermitida">The cantidad maxima permitida.</param>
        /// <param name="DiasDeBloqueo">The dias de bloqueo.</param>
        public Infraccion(string Descripcion, int CantidadMaximaPermitida, int DiasDeBloqueo)
        {
            this.descripcion = Descripcion;
            this.cantidadMaximaPermitida = CantidadMaximaPermitida;
            //this.sancionRelacionada = new Sancion(DiasDeBloqueo, Descripcion);

            if (TipoSancionCAD.BuscarPorDuracion(DiasDeBloqueo) == null)
            {
                Sancion.Save(new Sancion(DiasDeBloqueo, Descripcion));                      
            }

            this.sancionRelacionada = new Sancion(TipoSancionCAD.BuscarPorDuracion(DiasDeBloqueo));
            TipoInfraccionCAD.Save(Infraccion.MakeRaw(this));                 
        }
        /// <summary>
        /// Constructor que recibe como parametro un objeto InfraccionCAD y llena el objeto Infraccion de la 
        /// Capa de Negocios con la informacion contenida en este.
        /// </summary>
        /// <param name="InfraccionRaw">The infraccion raw.</param>
        public Infraccion(TipoInfraccionCAD InfraccionRaw)
        {
            this.id = InfraccionRaw.Id;
            this.descripcion = InfraccionRaw.Descripcion;
            this.cantidadMaximaPermitida = InfraccionRaw.CantidadMaxima;
        }
        /// <summary>
        /// Contructor que instancia una nueva infraccion para ser modificada en la base de datos.
        /// </summary>
        /// <param name="DescripcionOriginal">Descripcion de la infraccion que se modificara.</param>
        /// <param name="DescripcionNueva">Descripcion que se le asignara a la infraccion modificada.</param>
        /// <param name="FrecuenciaNueva">Frecuencia que se le asignara a la infraccion modificada.</param>
        /// <param name="SancionNueva">Duracion de la sancion que se le asignara a la infraccion recien creada.</param>
        public Infraccion(string DescripcionOriginal, string DescripcionNueva, int FrecuenciaNueva, int SancionNueva)
        {
            this.id = TipoInfraccionCAD.BuscarInfraccionPorDescripcion(DescripcionOriginal).Id;
            this.descripcion = DescripcionNueva;
            this.cantidadMaximaPermitida = FrecuenciaNueva;
            //this.sancionRelacionada = new Sancion(TipoInfraccionCAD.BuscarInfraccionPorDescripcion(DescripcionOriginal).TipoSancionID);
            //this.sancionRelacionada.Duracion = SancionNueva;
            //this.sancionRelacionada = new Sancion(SancionNueva, DescripcionNueva);

            if (TipoSancionCAD.BuscarPorDuracion(SancionNueva) == null)
            {
                Sancion.Save(new Sancion(SancionNueva, DescripcionNueva));
            }

            this.sancionRelacionada = new Sancion(TipoSancionCAD.BuscarPorDuracion(SancionNueva));

            TipoInfraccionCAD.Update(Infraccion.MakeRaw(this));
        }

        /// <summary>
        /// Metodo que se encarga de grabar una infraccion en la base de datos.
        /// </summary>
        /// <param name="InfraccionToSave">The infraccion to save.</param>
        public static void Save(Infraccion InfraccionToSave)
        {
            TipoInfraccionCAD.Save(Infraccion.MakeRaw(InfraccionToSave));
            Sancion.Save(InfraccionToSave.SancionRelacionada);
        }
        /// <summary>
        /// Metodo que se encarga de borrar de la base de datos las infrraciones.
        /// </summary>
        /// <param name="InfraccionToDelete">The infraccion to delete.</param>
        public static void Delete(Infraccion InfraccionToDelete)
        {
            TipoInfraccionCAD.Delete(Infraccion.MakeRaw(InfraccionToDelete));
        }

        /// <summary>
        /// Metodo que se encarga de convertir un objeto infraccion de la Capa de Negocios a uno de Capa Acceso Datos 
        /// para luego ser grabado en la base de datos.
        /// </summary>
        /// <param name="InfraccionToMakeRaw">The infraccion to make raw.</param>
        /// <returns></returns>
        public static TipoInfraccionCAD MakeRaw(Infraccion InfraccionToMakeRaw)
        {
            /*
            TipoInfraccionCAD InfraccionToReturn;

            InfraccionToReturn.Id = InfraccionToMakeRaw.ID;
            InfraccionToReturn.Descripcion = InfraccionToMakeRaw.Descripcion;
            InfraccionToReturn.Cantidad_Maxima = InfraccionToMakeRaw.CantidadMaximaPermitida;
            InfraccionToReturn.SancionRelacionada = InfraccionToMakeRaw.SancionRelacionada;

            return InfraccionToReturn;
            */

            return TipoInfraccionCAD.CrearTipoInfraccionCAD(InfraccionToMakeRaw.ID,
                                                            InfraccionToMakeRaw.Descripcion,
                                                            InfraccionToMakeRaw.CantidadMaximaPermitida,
                                                            InfraccionToMakeRaw.SancionRelacionada.ID);
        }
        //---------- </Constructores y demas metodos> ----------//
    }
}
